package com.adc.quicktools.process;



import com.adc.quicktools.file.FileControl;

/**
 * 
 * @TypeName: ProcessControl
 * @Package com.adc.quicktools.process
 * @Description: TODO( 自动创建守护线程、inputStream、ErrorStream、以及子进程，
 *               执行命令，继承该类，可以直接调用守护线程的不同方法，亦可以直接使用该类默认的传参方式 )
 * @author shen shenqiao2012@163.com
 * @date 2012-6-1 下午06:50:17
 */
public class ProcessControl {
	private boolean wait = false;
	private String outLog=null;
	/**
	 * @Description TODO( 默认的最大等待时间为10min )
	 */
	private Long MAXWaitTime = 10 * 60 * 1000L;

	/**
	 * @Description TODO( 默认的等待间隔为200毫秒 )
	 */
	private Long WaitGap = 200L;

	public ProcessControl() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * 
	 * @Title:
	 * @Description: TODO( 是否需要设定最大等待时间等待命令执行， 如果不需要，程序也不会卡死 )
	 * @param wait
	 *            true 为等待； false 为不等待
	 */
	public ProcessControl(boolean wait) {
		this.wait = wait;
	}

	/**
	 * @MethodName: executeCommand
	 * @author shen
	 * @Description: TODO( 执行命令行，目前win下测试通过，linux下命令的执行需要绑定/usr/bin等环境变量 )
	 * @param process
	 *            默认传入的process
	 * @return int
	 */
	public int executeCommand(Process process) {
		if (outLog==null) {
			outLog=FileControl.checkDirEndWith(FileControl.getAppPath(ProcessControl.class))+"logs/"+FileControl.getCurrentTimeString("")+".txt";
		}
		int outValue=-1;
		ExecDaemonThread daemonThread = new ExecDaemonThread(process,outLog);
		daemonThread.start();
		System.out.println("Deamon Thread is on the processing!");
		try {

			if (wait) {
				while (true) { // 默认一定等到守护线程返回状态值，
					if (daemonThread.getStatus() == 0) {
						outValue=daemonThread.getResultvalue();
						break;
					}
					Thread.sleep(WaitGap);
				}
			} else {
				Long tempTime = 0L;
				while (tempTime < MAXWaitTime) { // 根据最大等待时间等待返回值
					if (daemonThread.getStatus() == 0) {
						outValue=daemonThread.getResultvalue();
						break;
					}
					Thread.sleep(WaitGap);
					tempTime = tempTime + WaitGap;
					if (tempTime>=MAXWaitTime) {  //  即将跳出循环
//						logger.info(" process 执行失败！超出最大等待时间！ ");
						System.out.println("process 执行失败！超出最大等待时间！");
					}
				}
			}
		} catch (InterruptedException e) {
			System.out.println(" 等待返回结果时意外中断，线程出现异常！ ");
			e.printStackTrace();
		}
		return outValue;
	}

	/**
	 * @MethodName: setMAXWaitTime
	 * @author shen
	 * @Description: TODO( 设置最大等待时间 )
	 * @param mAXWaitTime
	 *            设定的最大等待时间
	 * @return void
	 */
	public void setMAXWaitTime(Long mAXWaitTime) {
		MAXWaitTime = mAXWaitTime;
	}

	public Long getMAXWaitTime() {
		return MAXWaitTime;
	}

	/**
	 * @MethodName: setWaitGap
	 * @author shen
	 * @Description: TODO( 设定每次等待的间隔，单位为毫秒 )
	 * @param waitGap
	 *            等待间隔
	 * @return void
	 */
	public void setWaitGap(Long waitGap) {
		WaitGap = waitGap;
	}

	public Long getWaitGap() {
		return WaitGap;
	}

	public String getOutLog() {
		return outLog;
	}

	public void setOutLog(String outLog) {
		this.outLog = outLog;
	}

}
